package com.priox.sigar.infraestructura.services;


import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.client.dto.GrupoEmpresarialDTO;
import com.priox.sigar.client.flt.GrupoEmpresarialFlt;
import com.priox.sigar.domain.model.GrupoEmpresarial;
import com.priox.sigar.domain.model.GrupoRepository;
import com.priox.sigar.domain.service.GrupoEmpresarialService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * User: allona
 * Date: 15/05/12
 */
@Service
public class GrupoEmpresarialServiceImpl implements GrupoEmpresarialService {

    @Autowired
    GrupoRepository repository;

    @Autowired
    private DTOMapperService mapperService;

    public List<GrupoEmpresarial> findByIds(List<Long> ids) {
       return repository.findByIds(ids);
    }
    public List<GrupoEmpresarialDTO> findAll() {
        List<GrupoEmpresarial> cadenas=repository.findAll();
        List<GrupoEmpresarialDTO> resultado=new ArrayList<GrupoEmpresarialDTO>();

        for(GrupoEmpresarial model:cadenas){
            GrupoEmpresarialDTO dto= mapperService.map(model, GrupoEmpresarialDTO.class);
            resultado.add(dto);
        }
        return resultado;
    }

    public List<GrupoEmpresarial> findAllCadenas() {
        return repository.findAll();
    }

    public List<GrupoEmpresarialDTO> findByFilter(GrupoEmpresarialFlt filtro) {
        GrupoEmpresarial cadena = mapperService.map(filtro, GrupoEmpresarial.class);
        List<GrupoEmpresarial> list= repository.findByFilter(cadena);
        
        List<GrupoEmpresarialDTO> resultado=new ArrayList<GrupoEmpresarialDTO>();
       
        for(GrupoEmpresarial model:list){
            GrupoEmpresarialDTO dto=mapperService.map(model,GrupoEmpresarialDTO.class);
            resultado.add(dto);
        }
        return resultado;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(GrupoEmpresarialDTO cadenaDTO,boolean updateMode) {
        GrupoEmpresarial cadena=mapperService.map(cadenaDTO, GrupoEmpresarial.class);
        if(updateMode){
            repository.merge(cadena);
        }else{
            repository.persist(cadena);
        }

    }

    @Transactional
    public void update(GrupoEmpresarialDTO anterior) {
        GrupoEmpresarial cadena=mapperService.map(anterior, GrupoEmpresarial.class);
        repository.merge(cadena);
    }

    public void delete(GrupoEmpresarialDTO nuevoRegistro) {
        repository.removeSociedadGrupo(nuevoRegistro.getGrupoEmpresarialId());
        repository.removeById(nuevoRegistro.getGrupoEmpresarialId());
    }

    @Transactional
    public GrupoEmpresarial findByCode(Long code){
        return repository.find(code);
    }

    @Transactional
    public List<GrupoEmpresarial> findByRUC(String ruc) {
        List<GrupoEmpresarial> list = new ArrayList<GrupoEmpresarial>();
        if(ruc!=null){
            list= repository.findByRUC(ruc);
        }
        return list;
    }
}
